package Data;

import Model.GeneroBean;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

public class GeneroDAO extends Conexao {

    public Vector listarGenero(String nome) throws SQLException {

        //Declaro a consulta
        String sql = "select * from genero where inativo = 'F'";

        //Crio um array de generos
        Vector dados = new Vector();

        //se tiver algum nome pra pesquisar modifico a consulta
        if (nome != null && !nome.isEmpty()) {
            sql += " and gendesc like '%" + nome + "%'";
        }

        //Pego uma conexao com o banco
        Connection conn = getConexao();

        //Preparo a consulta
        PreparedStatement ps = conn.prepareStatement(sql);

        //Executo a consulta
        ResultSet rs = ps.executeQuery();

        //Percorre todas as linhas de resultado da query
        while (rs.next()) {
            Vector linha = new Vector();

            //Preenche o genero com as informações
            linha.add(rs.getInt(1));
            linha.add(rs.getString(2));

            //Adiciona o cliente no array
            dados.add(linha);
        }

        //Fecho o PreparedStatment
        ps.close();

        //Retorno os generos encontrados
        return dados;
    }

    public List listarGeneroAsList(String nome) throws SQLException {

        //Declaro a consulta
        String sql = "select * from genero where inativo = 'F'";

        //Crio um array de generos
        List<GeneroBean> generos = new ArrayList<>();

        //se tiver algum nome pra pesquisar modifico a consulta
        if (nome != null && !nome.isEmpty()) {
            sql += " and gendesc like '%" + nome + "%'";
        }

        //Pego uma conexao com o banco
        Connection conn = getConexao();

        //Preparo a consulta
        PreparedStatement ps = conn.prepareStatement(sql);

        //Executo a consulta
        ResultSet rs = ps.executeQuery();

        //Percorre todas as linhas de resultado da query
        while (rs.next()) {
            GeneroBean genero = new GeneroBean();

            //Preenche o genero com as informações
            genero.setCodigo(rs.getInt(1));
            genero.setDescricao(rs.getString(2));

            //Adiciona o cliente no array
            generos.add(genero);
        }

        //Fecho o PreparedStatment
        ps.close();

        //Retorno os generos encontrados
        return generos;
    }

    public GeneroBean getGenero(int id) throws SQLException {

        //Validação do ID
        if (id < 1) {
            return null;
        }

        //Declaro a consulta
        String sql = "select * from genero where inativo = 'F' and gencod = ?";

        //Declaro o objeto de retorno
        GeneroBean genero = null;

        //Pego uma conexao com o banco
        Connection conn = getConexao();

        //Preparo a consulta
        PreparedStatement ps = conn.prepareStatement(sql);

        //Coloco os parametros na consulta
        ps.setObject(1, id);

        //Executo a consulta
        ResultSet rs = ps.executeQuery();

        //Se tiver algum resultado
        if (rs.next()) {
            genero = new GeneroBean();

            //Preenche o genero com as informações
            genero.setCodigo(rs.getInt(1));
            genero.setDescricao(rs.getString(2));

        }

        //Fecho o PreparedStatment
        ps.close();

        //Retorno os generos encontrados
        return genero;
    }

    public GeneroBean getGenero(String nome) throws SQLException {
        //Validação do nome
        if (nome == null || nome.isEmpty()) {
            return null;
        }

        //Declaração da Query
        String sql = "select * from genero where inativo = 'F' and gendesc like '%?%'";

        //Declaro o objeto de retorno
        GeneroBean genero = null;

        //Pego uma conexao com o banco
        Connection conn = getConexao();

        //Preparo a consulta
        PreparedStatement ps = conn.prepareStatement(sql);

        //Coloco os parametros na consulta
        ps.setObject(1, nome);

        //Executo a consulta
        ResultSet rs = ps.executeQuery();

        //Se tiver algum resultado
        if (rs.next()) {
            genero = new GeneroBean();

            //Preenche o genero com as informações
            genero.setCodigo(rs.getInt(1));
            genero.setDescricao(rs.getString(2));

        }

        //Fecho o PreparedStatment
        ps.close();

        //Retorno os generos encontrados
        return genero;

    }

    public boolean cadastrarGenero(GeneroBean genero) throws SQLException {
        //Validação do objeto
        if (genero == null) {
            return false;
        }

        //Declaro a query
        String sql = "insert into genero values (?,?)";

        //Pego uma conexao com o banco
        Connection conn = getConexao();

        //Preparo a consulta
        PreparedStatement ps = conn.prepareStatement(sql);

        //Colocando os parametros na consulta
        ps.setObject(1, genero.getDescricao());
        ps.setObject(2, "F");

        //Executo a consulta
        int resultado = ps.executeUpdate();

        //Fecho o prepared statment
        ps.close();

        //verifico se deu tudo certo
        if (resultado >= 1) {
            return true;
        } else {
            return false;
        }

    }

    public boolean alterarGenero(GeneroBean genero) throws SQLException {
        //Declaro a query
        String sql = "UPDATE GENERO "
                + " SET GENDESC = ?"
                + " WHERE GENCOD = ?";

        //Pego uma conexao com o banco
        Connection conn = getConexao();

        //Preparo a consulta
        PreparedStatement ps = conn.prepareStatement(sql);

        //Coloco os parametros na consulta
        ps.setObject(1, genero.getDescricao());
        ps.setObject(2, genero.getCodigo());


        //Executo a consulta
        int resultado = ps.executeUpdate();

        //Fecho o ps
        ps.close();

        //Verifico se atualizou algum registro
        if (resultado >= 1) {
            return true;
        } else {
            return false;
        }

    }

    public boolean deletarGenero(int id) throws SQLException {

        //Validação do ID
        if (id < 1) {
            return false;
        }

        //Declaro a query
        String sql = "update genero set inativo = 'T' where gencod = ?";

        //Pego uma conexao com o banco
        Connection conn = getConexao();

        //Preparo a consulta
        PreparedStatement ps = conn.prepareStatement(sql);

        //Coloco os parametros na consulta
        ps.setObject(1, id);

        //Executo a consulta
        int resultado = ps.executeUpdate();

        //verifico se deu tudo certo
        if (resultado >= 1) {
            return true;
        } else {
            return false;
        }
    }

    public boolean deletarGenero(GeneroBean genero) throws SQLException {

        //Validação do objeto e dos parametros
        if (genero != null && genero.getCodigo() > 0) {

            //Retorno o retorno do outro metodo
            return deletarGenero(genero.getCodigo());
        } else {

            //Retorna false porque o objeto ou seus valores sao invalidos
            return false;
        }
    }
}
